#ifndef NANO_TCP_HH_
#define NANO_TCP_HH_
#include <assert.h>
#include <nanomsg/nn.h>
#include <nanomsg/pubsub.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <unistd.h>
#include <iostream>
#include <string>
using namespace std;
class nano_tcp {
public:
    int tcp_pub;
    int tcp_sub;
    nano_tcp(){};
    nano_tcp(const char *sub_addr_, const char *pub_addr_) :
        sub_addr(sub_addr_), pub_addr(pub_addr_){};
    bool nano_tcp_pub_init(string pub_adr) {
        pub_addr = pub_adr.c_str();
        tcp_pub = nn_socket(AF_SP, NN_PUB);
        assert(tcp_pub >= 0);
        // assert(nn_bind(tcp_pub, pub_addr) >= 0); // 绑定用于进程间消息接收的消息队列的地址
        if (nn_bind(tcp_pub, pub_addr) >= 0)
            return true;
        else
            return false;
    }
    bool nano_tcp_pub_init() {
        tcp_pub = nn_socket(AF_SP, NN_PUB);
        assert(tcp_pub >= 0);
        // assert(nn_bind(tcp_pub, pub_addr) >= 0); // 绑定用于进程间消息接收的消息队列的地址
        if (nn_bind(tcp_pub, pub_addr) >= 0)
            return true;
        else
            return false;
    }
    bool nano_tcp_sub_init() {
        tcp_sub = nn_socket(AF_SP, NN_SUB);
        assert(tcp_sub >= 0);
        // 绑定本地地址
        // assert(nn_connect(tcp_sub, sub_addr) >= 0);
        if (nn_connect(tcp_sub, sub_addr) >= 0) {
            nn_setsockopt(tcp_sub, NN_SUB, NN_SUB_SUBSCRIBE, "", 0);
            return true;
        } else
            return false;
    }
    bool nano_tcp_sub_init(string sub_adr) {
        sub_addr = sub_adr.c_str();
        tcp_sub = nn_socket(AF_SP, NN_SUB);
        assert(tcp_sub >= 0);
        // 绑定本地地址
        // assert(nn_connect(tcp_sub, sub_addr) >= 0);
        // sub是用来订阅的
        if (nn_connect(tcp_sub, sub_addr) >= 0) {
            nn_setsockopt(tcp_sub, NN_SUB, NN_SUB_SUBSCRIBE, "", 0);
            return true;
        } else
            return false;
    }
    int nano_tcp_send(uint8_t *sndmsg, size_t num) {
        return nn_send(tcp_pub, sndmsg, num, NN_DONTWAIT);
    }
    int nano_tcp_recive(uint8_t *rcvmsg, size_t num) {
        return nn_recv(tcp_sub, rcvmsg, num, 0);
    }

private:
    const char *sub_addr;
    const char *pub_addr;
};
#endif